/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.trandio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.naming.NamingException;
import org.trandio.model.FacturaVO;
import org.trandio.model.PlanoACVO;
import org.trandio.model.PlanoAPVO;
import org.trandio.model.ServicioVO;
import org.trandio.util.ConexionDb;

/**
 *
 * @author root
 */
public class FacturaDAO implements FacturaInterfase {

    @Override
    public int getCantFacturas(String param) throws SQLException, NamingException {

        ConexionDb con = new ConexionDb();

        Connection conn;

        conn = con.traerConexion();

        int count = 0;

        String sql = "SELECT count(*) FROM tb_factura";

        PreparedStatement stmt = conn.prepareStatement(sql);

        try {
            ResultSet res = stmt.executeQuery();
            try {
                if (res.next()) {
                    count = res.getInt(1);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();

            if (!conn.isClosed()) {

                conn.close();
            }
        }

        return count;
    }

    @Override
    public List<FacturaVO> getFacturas(int displayStart, int displayLength, String param, String orden) throws SQLException, NamingException {

        ConexionDb con = new ConexionDb();

        Connection conn;

        conn = con.traerConexion();

        List<FacturaVO> listFactura = new ArrayList<FacturaVO>();

        String condicion = "";

        if (!param.equals("")) {

            //condicion = " WHERE tb_factura.numero LIKE '%"+param+"%' ";
            condicion = param;

        }

        String sql = "SELECT tb_factura.id, tb_factura.numero, tb_factura.observacion, tb_factura.id_paciente, tb_factura.id_entidad, "
                + "tb_factura.id_contrato, tb_factura.fecha, tb_factura.id_servicio, tb_factura.id_usuario, tb_factura.id_detalleturno, "
                + "tb_factura.estado, tb_factura.impresa, tb_factura.valor, tb_factura.valor_subsidio, tb_factura.valor_copago"
                + ",p.nombre1,p.nombre2,p.apellido1,p.apellido2, p.numero_identificacion"
                + " FROM tb_factura"
                + " INNER JOIN tb_paciente p ON (p.id=tb_factura.id_paciente) "
                + condicion + " " + orden + " LIMIT " + displayLength + " OFFSET " + displayStart;

        System.out.println("Sql BUSCAR ACTIVIDAD POR ID: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);

        try {

            ResultSet res = stmt.executeQuery();

            try {

                while (res.next()) {

                    FacturaVO facturaVO = new FacturaVO();
                    facturaVO.setIdfactura(res.getString("id"));
                    facturaVO.setNumfactura(res.getString("numero"));
                    facturaVO.setFecha(res.getString("fecha"));
                    facturaVO.setPaciente(res.getString("nombre1") + " " + res.getString("nombre2") + " " + res.getString("apellido1") + " " + res.getString("apellido2"));
                    facturaVO.setNumIde(res.getString("numero_identificacion"));
                    listFactura.add(facturaVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return listFactura;
    }

    @Override
    public ServicioVO getServicioFactura(int idfactura) throws SQLException, NamingException {

        ConexionDb con = new ConexionDb();

        Connection conn;

        conn = con.traerConexion();

        String sql = "SELECT tb_servicio.codigo, tb_servicio.descripcion,"
                + " tb_servicio.copago, tb_servicio.estancia, tb_servicio.id idservicio"
                + " FROM public.tb_servicio, public.tb_factura"
                + " WHERE "
                + "tb_servicio.id = tb_factura.id_servicio AND"
                + " tb_factura.id = " + idfactura;

        System.out.println("Servicio factura: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);

        ResultSet res = stmt.executeQuery();

        ServicioVO servicioVO = new ServicioVO();

        if (res.next()) {

            servicioVO.setCodigo(res.getString("codigo"));
            servicioVO.setCopago(res.getBoolean("copago"));
            servicioVO.setDescripcion(res.getString("descripcion"));
            servicioVO.setEstancia(res.getBoolean("estancia"));
            servicioVO.setId(res.getInt("idservicio"));

        }

        res.close();
        stmt.close();
        if (!conn.isClosed()) {
            conn.close();
        }

        return servicioVO;

    }

    @Override
    public PlanoACVO getPlanoAC(int iddetalleadmisionac) throws SQLException, NamingException {

        ConexionDb con = new ConexionDb();

        Connection conn;

        conn = con.traerConexion();

        String condicion = " WHERE id_detalle_admision=" + iddetalleadmisionac;
        String sql = "SELECT "
                + "public.tb_ripsac.id,"
                + "public.tb_factura.numero, "
                + "public.tb_sede.codigo_prestador, "
                + "public.tb_tipoidentificacion.codigo tipoide, "
                + "public.tb_paciente.numero_identificacion, "
                + "public.tb_ripsac.numero_orden,"
                + "public.tb_actividad.codigo, "
                + "public.tb_ripsac.id_finalidad,"
                + "public.tb_ripsac.id_causaex,"
                + "public.tb_ripsac.coddx_pal,"
                + "public.tb_ripsac.coddx_rel1,"
                + "public.tb_ripsac.coddx_rel2,"
                + "public.tb_ripsac.coddx_rel3,"
                + "public.tb_ripsac.id_tipodx,"
                //+ "public.tb_ripsac.id_detalle_factura,"
                + "public.tb_diagnostico.id iddxpal,"
                + "public.tb_diagnostico.descripcion desdxpal,"
                + "tb_diagnostico1.id iddx1,"
                + "tb_diagnostico1.descripcion desdx1,"
                + "tb_diagnostico2.id iddx2,"
                + "tb_diagnostico2.descripcion desdx2,"
                + "tb_diagnostico3.id iddx3,"
                + "tb_diagnostico3.descripcion desdx3 "
                + "FROM "
                + "public.tb_ripsac "
                + "INNER join tb_factura on (tb_ripsac.id_factura = tb_factura.id) "
                + "INNER join tb_sede on (tb_factura.id_sede = tb_sede.id) "
                + "INNER join tb_paciente on (tb_ripsac.id_paciente = tb_paciente.id) "
                + "INNER join tb_tipoidentificacion on (tb_paciente.id_tipo_identificacion = tb_tipoidentificacion.id) "
                + "INNER join tb_actividad on (tb_ripsac.id_actividad = tb_actividad.id) "
                + "INNER JOIN public.tb_diagnostico ON (public.tb_ripsac.coddx_pal = public.tb_diagnostico.codigo) "
                + "LEFT JOIN public.tb_diagnostico tb_diagnostico1 ON (public.tb_ripsac.coddx_rel1 = tb_diagnostico1.codigo) "
                + "LEFT JOIN public.tb_diagnostico tb_diagnostico2 ON (public.tb_ripsac.coddx_rel2 = tb_diagnostico2.codigo) "
                + "LEFT JOIN public.tb_diagnostico tb_diagnostico3 ON (public.tb_ripsac.coddx_rel3 = tb_diagnostico3.codigo) " + condicion;

        System.out.println("lista AC: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);

        PlanoACVO planoACVO = new PlanoACVO();

        try {

            ResultSet res = stmt.executeQuery();

            try {

                if (res.next()) {

                    planoACVO.setNumFactura(res.getString("numero_factura"));
                    planoACVO.setCodPrestador(res.getString("codigo_prestador"));
                    planoACVO.setFecha(res.getString("fecha"));
                    planoACVO.setNumOrden(res.getString("numero_orden"));
                    planoACVO.setCodActividad(res.getString("codigo_actividad"));
                    planoACVO.setFinalidad(res.getString("id_finalidad"));
                    planoACVO.setCausaExterna(res.getString("id_causaex"));

                    planoACVO.setDxPal(res.getString("coddx_pal"));
                    planoACVO.setIddxpal(res.getInt("iddxpal"));
                    planoACVO.setDesdxpal(res.getString("desdxpal"));

                    planoACVO.setDxRel1(res.getString("coddx_rel1"));
                    planoACVO.setIddxRel1(res.getInt("iddx1"));
                    planoACVO.setDesdxRel1(res.getString("desdx1"));

                    planoACVO.setDxRel2(res.getString("coddx_rel2"));
                    planoACVO.setIddxRel2(res.getInt("iddx2"));
                    planoACVO.setDesdxRel2(res.getString("desdx2"));

                    planoACVO.setDxRel3(res.getString("coddx_rel3"));
                    planoACVO.setIddxRel3(res.getInt("iddx3"));
                    planoACVO.setDesdxRel3(res.getString("desdx3"));

                    planoACVO.setTipoDx(res.getString("id_tipodx"));

                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }

        return planoACVO;

    }

    @Override
    public PlanoAPVO getPlanoAP(int iddetalle) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String condicion = " WHERE id_detalle_factura=" + iddetalle;

        String sql = "SELECT "
                + "public.tb_ripsap.id,"
                + "public.tb_ripsap.numero_factura,"
                + "public.tb_ripsap.codigo_prestador,"
                + "public.tb_ripsap.id_paciente,"
                + "public.tb_ripsap.fecha,"
                + "public.tb_ripsap.numero_orden,"
                + "public.tb_ripsap.codigo_actividad,"
                + "public.tb_ripsap.id_ambitopx,"
                + "public.tb_ripsap.id_finalidad,"
                + "public.tb_ripsap.id_personalatiende,"
                + "public.tb_ripsap.id_formaactoqx,"
                + "public.tb_ripsap.id_detalle_factura,"
                + "public.tb_diagnostico.codigo coddx_pal,"
                + "public.tb_diagnostico.descripcion desdx_pal,"
                + "tb_diagnostico1.codigo coddx_rel1,"
                + "tb_diagnostico1.descripcion desdx_rel1,"
                + "tb_diagnostico2.codigo coddx_com,"
                + "tb_diagnostico2.descripcion desdx_com"
                + " FROM "
                + "public.tb_ripsap "
                + "INNER JOIN public.tb_diagnostico ON (public.tb_ripsap.coddx_pal = public.tb_diagnostico.codigo) "
                + "LEFT OUTER JOIN public.tb_diagnostico tb_diagnostico1 ON (public.tb_ripsap.coddx_rel = tb_diagnostico1.codigo) "
                + "LEFT OUTER JOIN public.tb_diagnostico tb_diagnostico2 ON (public.tb_ripsap.coddx_complicacion = tb_diagnostico2.codigo) " + condicion;

        System.out.println("lista AP: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);

        PlanoAPVO planoAPVO = new PlanoAPVO();

        try {
            ResultSet res = stmt.executeQuery();
            try {

                if (res.next()) {

                    planoAPVO.setNumFactura(res.getString("numero_factura"));
                    planoAPVO.setCodPrestador(res.getString("codigo_prestador"));
                    planoAPVO.setFecha(res.getString("fecha"));
                    planoAPVO.setNumOrden(res.getString("numero_orden"));
                    planoAPVO.setCodActividad(res.getString("codigo_actividad"));
                    planoAPVO.setFinalidad(res.getString("id_finalidad"));
                    planoAPVO.setAmbito(res.getString("id_ambitopx"));
                    planoAPVO.setPeratiende(res.getString("id_personalatiende"));
                    planoAPVO.setFormaActoQx(res.getString("id_formaactoqx"));
                    planoAPVO.setDxPal(res.getString("coddx_pal"));
                    planoAPVO.setDesdxPal(res.getString("desdx_pal"));
                    planoAPVO.setDxRel1(res.getString("coddx_rel1"));
                    planoAPVO.setDesdxRel1(res.getString("desdx_rel1"));
                    planoAPVO.setDxComplic(res.getString("coddx_com"));
                    planoAPVO.setDesdxComplic(res.getString("desdx_com"));
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return planoAPVO;
    }
}
